package com.itdachang.design.creatation.prototype;

/**
 * 原型模式
 * 是用于创建重复的对象，同时又能保证性能
 * 1、Mybatis 操作数据，从数据库中查询出很多记录 （70%改变很少）
 * 2、每次查询数据库，查询到结果后都需要封装一个对象 返回
 *      10000 thread 查询一个记录 new User("张三", 18)  一万并发 创建一万个 User
 * 3、解决: 缓存 查过的保存
 *      如果查到相同记录，拿到原来的原型对象
 *
 * 原型模式（Prototype Pattern） 是用于创建重复的对象，同时又能保证性能
 * 本体给外部提供一个克隆体进行使用
 *
 * 什么场景用到？
 * 资源优化
 * 性能和安全要求
 * 一个对象多个修改者的场景
 * 一个对象需要提供给其他对象访问，而且各个调用者可能都需要修改其他值时可以考虑使用原型模式拷贝多个对象供对调用者调用
 * 深【两个完全不一样，属性是对象，也得拷贝【递归克隆】】、浅【拷贝属性】
 * @author gcq
 * @Create 2022-02-06
 */
public class MainTest {

    public static void main(String[] args) throws Exception {
        GuiguMybatis mybatis = new GuiguMybatis();

        /**
         * 每次都从数据库差，都需要创建对象
         */
        User zhangsan1 = mybatis.getUser("zhangsan");
        System.out.println("1 -->" + zhangsan1);
        // 更改属性后
//        System.out.println("张三自己更改了:" + zhangsan1);

        User zhangsan2 = mybatis.getUser("zhangsan");
        zhangsan2.setUsername("李四");

        System.out.println("2 -->" + zhangsan2);

        User zhangsan3 = mybatis.getUser("zhangsan");
        System.out.println("3 -->" + zhangsan3);

    }
}